import axios from "axios";

// 创建一个axios实例
const instance = axios.create({
  baseURL: "/api",
  timeout: 300000,
  headers: {
    "Content-Type": "application/json",
    "X-Token": getLocalToken(), // headers塞token
  },
});

let isRefreshing = false;
// 重试队列，每一项将是一个待执行的函数形式
let requests = [];
instance.interceptors.response.use(
  async (response) => {
    return response.data;
  },
  async (error) => {
    const { code } = error.response;
    if (code === 401 || code === 403) {
      if (!isRefreshing) {
        // 通知ios刷新cookie
        isRefreshCookie();
        const cookie = await getRefreshCookie(); // 获取ios返回的cookie
        isRefreshing = true;
        await cookieStore.set(cookie);
        return userStore
          .setUser()
          .then(() => {
            config.headers["crsf-token"] = "获取到的cookie转换";
            // 已经刷新了token，将所有队列中的请求进行重试
            requests.forEach((cb) => cb(config.headers["crsf-token"]));
            // 重试完了别忘了清空这个队列（掘金评论区同学指点）
            requests = [];
            return instance(config);
          })
          .catch((error) => {
            // ios返回的cookie失败
            return Promise.reject(error);
          })
          .finally(() => {
            isRefreshing = false;
          });
      } else {
        // 保存失败请求
        // 正在刷新token，返回一个未执行resolve的promise
        return new Promise((resolve) => {
          // 将resolve放进队列，用一个函数形式来保存，等token刷新后直接执行
          requests.push((token) => {
            config.headers["crsf-token"] = token;
            resolve(instance(config));
          });
        });
      }
    }

    return Promise.reject(error);
  }
);

function refreshToken() {
  // instance是当前request.js中已创建的axios实例
  return instance.post("/refreshtoken").then((res) => res.data);
}

export default instance;
